/* Clase desde la cual el usuario tendra acceso a las funcionalidades del sistema*/
package cliente;

import java.io.*;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.util.ArrayList;
import java.util.Iterator;
import sop_rmi.Impl_Canciones;
import sop_rmi.Impl_Usuarios;
import sop_rmi.Int_Canciones;
import sop_rmi.Int_Usuarios;

public class Usuario_Menus {
    
    
    public static void main(String args[]) throws IOException, NotBoundException
    {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String sesion="luis";           //almacena el login del usuario logeado, este dato es necesrio
        int op=0;
        int s=0;
        Usuario_Impl usuario = new Usuario_Impl();
        Usuario_Impl temp = new Usuario_Impl();
        ArrayList<Cancion_Impl> canciones= new ArrayList();
        Cancion_Impl cancion=new Cancion_Impl();
        Lista_Impl lista=new Lista_Impl();
         String nom,apellido,num_ide,login,pass,tipo;
         
        ////////servidor de usuarios /////////
        Int_Usuarios int_user= (Int_Usuarios)Naming.lookup((new StringBuilder()).append("rmi://").append(args[0]).append(":").append(args[1]).append("/usu").toString());
        
        ////////servidor de canciones//////////
        Int_Canciones int_canciones= (Int_Canciones)Naming.lookup((new StringBuilder()).append("rmi://").append(args[0]).append(":").append(args[1]).append("/can").toString());
        
        do
        {
        System.out.println("----------- Menu Inicial --------------");
        System.out.println("1. Registrarse en el Sistema");
        System.out.println("2. Entrar en el Sistema.");
        System.out.println("3. Salir. ");
        System.out.println("---------------------------------------");  
        System.out.print("Digite opcion: ");
        op=Integer.parseInt(bf.readLine());
        switch(op)
        {
            case 1:
                System.out.println("---------- Registrar Nuevo Usuario -----------------");
                System.out.print(" Nombre:  ");
                usuario.setNombre(bf.readLine());
                System.out.print(" Apellido:  ");
                usuario.setApellido(bf.readLine());
                System.out.print(" Numero de Identificacion:  ");
                usuario.setNum_Ide(bf.readLine());
                System.out.print(" Login:  ");
                usuario.setLogin(bf.readLine());
                System.out.print(" Password:  ");
                usuario.setPasssword(bf.readLine());
                usuario.setTipo("user");
                System.out.println();
                if(int_user.Registar_Usuario(usuario))
                {
                    System.out.println("Usuario Registrado Crorrectamente");
                    System.out.println("Presione una tecla para continuar");
                    bf.readLine();
                }
                else
                {
                    System.out.println("Error al realizar el registro");
                    System.out.println("Presione una tecla para continuar");
                    bf.readLine();
                }    
                
                
                
                
                
                break;
            case 2:
                System.out.println("----------- Iniciar Sesion --------------\n");
                System.out.println("Login de Usuario : "); usuario.setLogin(bf.readLine());
                System.out.println("Contraseña :");usuario.setPasssword(bf.readLine());
                
                   
                        /*Esta es la funcionalidad que valida si el usuario esta registrado y le permite iniciar sesion*/
                        nom=int_user.Obterner_Usuario(usuario).getNombre();          //  |
                        apellido=int_user.Obterner_Usuario(usuario).getApellido();   //  |
                        login=int_user.Obterner_Usuario(usuario).getLogin();         //  |--> se llama al metodo remoto que 
                        num_ide=int_user.Obterner_Usuario(usuario).getNum_Ide();     //  |    obtiene del servidor de usuarios
                        pass=int_user.Obterner_Usuario(usuario).getPassword();       //  |    y le asigna a cada variable su
                        tipo=int_user.Obterner_Usuario(usuario).getTipo();           //  |    valor.
                    
                        
                    if(nom!=null)
                    {
                        if(tipo.equals("admin")&& !pass.equals("nada")){s=1; sesion=login;}
                        else
                        if(tipo.equals("user")&& !pass.equals("nada")){s=2; sesion=login;}
                        else
                        {
                        System.out.println("Contraseña Invalida");
                        s=0;
                        }
                    }
              
                    if(s==1)
                    {    
                        do
                        {
                            System.out.println("----------- Menu Administrador --------------");
                            System.out.println("|| 1. Listar Usuarios                      ||");
                            System.out.println("|| 2. Buscar Usuario por Login             ||");
                            System.out.println("|| 3. Editar Usuario                       ||");
                            System.out.println("|| 4. Eliminar Usuario                     ||");
                            System.out.println("|| 5. Modificar Lista de Reproduccion      ||");
                            System.out.println("|| 6. Eliminar Lista de Reproduccion       ||");
                            System.out.println("|| 7. Salir.                               ||");
                            System.out.println("---------------------------------------------");  
                            System.out.print("Digite opcion: ");
                            op=Integer.parseInt(bf.readLine());
                            switch(op)
                            { 
                                case 1:
                                    System.out.println("----------------- Listado de Usuarios -----------------");
                                    ArrayList<Usuario_Impl> listaU = new ArrayList<Usuario_Impl>();
                                    
                                    listaU = int_user.ListarUsuarios();
                                    
                                    int i=0;
                                    while (i<listaU.size())
                                    {    
                                        System.out.println("//////////////////////////////////////////////");
                                        System.out.println("Nombre del Usuario: "+listaU.get(i).getNombre());
                                        System.out.println("Apellido del Usuario: "+listaU.get(i).getApellido());
                                        System.out.println("Login del Usuario: "+listaU.get(i).getLogin());
                                        System.out.println("Numero de Identificacion del Usuario: "+listaU.get(i).getNum_Ide());
                                        System.out.println("Tipo de Usuario: "+listaU.get(i).getTipo());
                                        System.out.println("//////////////////////////////////////////////");
                                        System.out.println();
					i++;
										
                                    }
                                    System.out.println("Digite una tecla para continuar");
				    bf.readLine();
                                    break;
                                case 2:
                                    System.out.println("----------------- Buscar de Usuarios -----------------");
                                    System.out.println("Login de Usuario : "); usuario.setLogin(bf.readLine());
                                                  
                   
                                    /*Esta es la funcionalidad que valida si el usuario esta registrado y le permite iniciar sesion*/
                                    nom=int_user.Obterner_Usuario(usuario).getNombre();          //  |
                                    apellido=int_user.Obterner_Usuario(usuario).getApellido();   //  |
                                    login=int_user.Obterner_Usuario(usuario).getLogin();         //  |--> se llama al metodo remoto que 
                                    num_ide=int_user.Obterner_Usuario(usuario).getNum_Ide();     //  |    obtiene del servidor de usuarios
                                    pass=int_user.Obterner_Usuario(usuario).getPassword();       //  |    y le asigna a cada variable su
                                    tipo=int_user.Obterner_Usuario(usuario).getTipo();           //  |    valor.
                                    System.out.println("----------------- Descripcion de Usuario -----------------");
                                    System.out.println("//////////////////////////////////////////////");
                                    System.out.println("Nombre del Usuario: "+nom);
                                    System.out.println("Apellido del Usuario: "+apellido);
                                    System.out.println("Login del Usuario: "+login);
                                    System.out.println("Numero de Identificacion del Usuario: "+num_ide);
                                    System.out.println("Tipo de Usuario: "+tipo);
                                    System.out.println("//////////////////////////////////////////////");
                                    System.out.println();
                                    
                                    
                                    System.out.println("Digite una tecla para continuar");
				    bf.readLine();
                                    
                                    break;
                                case 3:
                                    /*funcion en desarrollo no esta terminada del todo*/
                                    System.out.println("----------------- Editar Usuarios -----------------");
                                    System.out.println("Login de Usuario : "); usuario.setLogin(bf.readLine());
                                                  
                   
                                    /*Esta es la funcionalidad que valida si el usuario esta registrado y le permite iniciar sesion*/
                                    nom=int_user.Obterner_Usuario(usuario).getNombre();          //  |
                                    apellido=int_user.Obterner_Usuario(usuario).getApellido();   //  |
                                    login=int_user.Obterner_Usuario(usuario).getLogin();         //  |--> se llama al metodo remoto que 
                                    num_ide=int_user.Obterner_Usuario(usuario).getNum_Ide();     //  |    obtiene del servidor de usuarios
                                    pass=int_user.Obterner_Usuario(usuario).getPassword();       //  |    y le asigna a cada variable su
                                    tipo=int_user.Obterner_Usuario(usuario).getTipo();           //  |    valor.
                                    
                                    if(nom!=null)
                                    {    
                                    System.out.println("----------------- Descripcion de Usuario -----------------");
                                    System.out.println("//////////////////////////////////////////////");
                                    System.out.println("Nombre del Usuario: "+nom);
                                    System.out.println("Apellido del Usuario: "+apellido);
                                    System.out.println("Login del Usuario: "+login);
                                    System.out.println("Numero de Identificacion del Usuario: "+num_ide);
                                    System.out.println("Tipo de Usuario: "+tipo);
                                    System.out.println("//////////////////////////////////////////////");
                                    System.out.println();
                                    
                                    System.out.println("----------------- Digite los Nuevos Campos del Usuario -----------------");
                                    System.out.print(" Nombre:  ");
                                    usuario.setNombre(bf.readLine());
                                    System.out.print(" Apellido:  ");
                                    usuario.setApellido(bf.readLine());
                                    System.out.print(" Numero de Identificacion:  ");
                                    usuario.setNum_Ide(bf.readLine());
                                    usuario.setLogin(login);
                                    System.out.print(" Password:  ");
                                    usuario.setPasssword(bf.readLine());
                                    System.out.print(" Tipo  user o admin:  ");
                                    usuario.setTipo(bf.readLine());
                                    System.out.println();
                                    
                                    int_user.Actualizar_Usuario(usuario);
                                     System.out.println("La informacion del usario a sido actualizada");
                                    }
                                    else
                                       System.out.println("El usuario no fue encntrado"); 
                                    
                                    System.out.println("Digite una tecla para continuar");
				    bf.readLine();
                                    break;
                                case 4:
                                    /*funcion en desarrollo no esta terminada del todo*/
                                    System.out.println("----------------- Eliminar Usuarios -----------------");
                                    System.out.println("Login de Usuario : "); usuario.setLogin(bf.readLine());
                                                  
                                      
                                    /*Esta es la funcionalidad que valida si el usuario esta registrado y le permite iniciar sesion*/
                                    nom=int_user.Obterner_Usuario(usuario).getNombre();          //  |
                                    apellido=int_user.Obterner_Usuario(usuario).getApellido();   //  |
                                    login=int_user.Obterner_Usuario(usuario).getLogin();         //  |--> se llama al metodo remoto que 
                                    num_ide=int_user.Obterner_Usuario(usuario).getNum_Ide();     //  |    obtiene del servidor de usuarios
                                    pass=int_user.Obterner_Usuario(usuario).getPassword();       //  |    y le asigna a cada variable su
                                    tipo=int_user.Obterner_Usuario(usuario).getTipo();           //  |    valor.
                                    if(nom!=null)
                                    {    
                                    System.out.println("----------------- Descripcion de Usuario -----------------");
                                    System.out.println("//////////////////////////////////////////////");
                                    System.out.println("Nombre del Usuario: "+nom);
                                    System.out.println("Apellido del Usuario: "+apellido);
                                    System.out.println("Login del Usuario: "+login);
                                    System.out.println("Numero de Identificacion del Usuario: "+num_ide);
                                    System.out.println("Tipo de Usuario: "+tipo);
                                    System.out.println("//////////////////////////////////////////////");
                                    System.out.println();
                                    String cof;
                                    
                                    
                                     System.out.print("Esta seguro de Eliminar este usuario del sistema [S/N]: ");
                                    cof=bf.readLine(); 
                                    if(cof.equals("s")||cof.equals("S"))
                                    {    
                                    int_user.Eliminar_Usaurio(login);
                                    System.out.println("El usuario a sido eliminado del sistema");
                                    }
                                    else
                                       System.out.println("Accion cancelada"); 
                                    }
                                    else
                                        System.out.println("El usuario no fue encntrado");
                                    System.out.println("Digite una tecla para continuar");
				    bf.readLine();
                                    break;
                                case 5:
                                    break;
                                case 6:
                                    // <editor-fold desc="Implementado y funcionando">
                                        System.out.println("--------Elinimacion de una lista---------");
                                        System.out.print("Nombre de la lista que quiere eliminar (sin extencion): ");
                                        String nombre = bf.readLine();
                                        String[] split = nombre.split("_lista_");
                                        op=Integer.parseInt(split[1]);
                                        System.out.println("login : "+split[0]);
                                        System.out.println("numero : "+op);
                                        System.out.print("Confirma la eliminacion 1 si   2 no");
                                        int conf =Integer.parseInt(bf.readLine());
                                        if (conf ==2) break;
                                        if (int_canciones.EliminarLista(split[0],op))
                                            System.out.println("la lista fue eliminada");
                                        else System.out.println("la lista no fue eliminada");
                                        break;
                                    // </editor-fold>
                                case 7:
                                    break;
                                default:
                                    System.out.println("Digite una opcion valida");
                                    break;
                            } 
                        }while(op!=7);   
                    }
                    if(s==2)
                    {
                        do
                        {
                            System.out.println("----------- Menu Usuario --------------");
                            System.out.println("||1. Crear Lista de Reproduccion     ||");
                            System.out.println("||2. Registar Nueva Cancion          ||");
                            System.out.println("||3. Editar Datos de una Cancion     ||");
                            System.out.println("||4. Borra una Cancion de una Lista  ||");
                            System.out.println("||5. Buscar una Cancion              ||");
                            System.out.println("||6. Desplegar Lista de Reproduccion ||");
                            System.out.println("||7. Mostar Detalles de una Cancion  ||");
                            System.out.println("||8. Salir.                          ||");
                            System.out.println("---------------------------------------");  
                            System.out.print("Digite opcion:");
                            op=Integer.parseInt(bf.readLine());
                            switch(op)
                            { 
                                case 1:
                                    // <editor-fold desc="Implementado y funcionando">
                                        lista.setLogin(sesion);
                                        canciones.clear();
                                        do
                                        {
                                            cancion=hacer_cancion();
                                            canciones.add(cancion);
                                            System.out.println("1 Para agragar otra cancion");
                                            System.out.println("Cualquier tecla para continuar");
                                            op=Integer.parseInt(bf.readLine());
                                        }while(op==1);
                                        lista.setCanciones(canciones);
                                        if (int_canciones.CrearLista(lista))
                                            System.out.println("La lista se creo exitosamente");
                                        else
                                            System.out.println("Se produjo un error la lista no se creo");
                                    // </editor-fold>
                                    break;
                                case 2:
                                    // <editor-fold desc="Implementado y funcionando">
                                        System.out.println("----Agragar una Cancion a una lista -----");
                                        System.out.println("\n Numero de la lista :");
                                        op=Integer.parseInt(bf.readLine());
                                        cancion=hacer_cancion();
                                        if (int_canciones.AgregarCancion(sesion, op, cancion))
                                            System.out.println("La cancion fue agragada exitosamente");
                                        else
                                            System.out.println("La cancion NO fue agragada ");
                                    // </editor-fold>
                                    break;
                                case 3:
                                    break;
                                case 4:
                                    // <editor-fold desc="Implementado y funcionando">
                                        int op1;
                                        System.out.println("------------Borrar cancion de una lista-----------\n");
                                        System.out.print("Codido de la cancion  :  "); op=Integer.parseInt(bf.readLine());
                                        System.out.print("Numero de la lista    :  "); op1=Integer.parseInt(bf.readLine());
                                        cancion.setCodigo(op);
                                        if (int_canciones.EliminarCancion(sesion, op1, cancion))
                                            System.out.print("la cancion fue eliminada");
                                        else System.out.print("No fue posible eliminar la cancion");
                                        break;
                                    // </editor-fold> 
                                case 5: 
                                    // <editor-fold desc="Implementado y funcionando">
                                        System.out.println("------------Buscar cancion-----------\n");
                                        
                                        System.out.println("1. Buscar por titulo");
                                        System.out.println("2. Buscar por artista");
                                        op=Integer.parseInt(bf.readLine());
                                        cancion =new Cancion_Impl();
                                        if (op==1) cancion.setTitulo(bf.readLine());
                                        if (op==2) cancion.setArtista(bf.readLine());
                                        System.out.print("Nuemro de la lista en la que quiere buscar : ");
                                        op=Integer.parseInt(bf.readLine());
                                        ArrayList<Cancion_Impl> ObtenerCancion = int_canciones.BuscarCancion(login, op, cancion);
                                        if(ObtenerCancion==null)
                                            System.out.println("No existe la cancion en esta lista");
                                        else
                                        {
                                            System.out.println("///////////Cancion/////////\n");
                                            for(int x=0;x<ObtenerCancion.size();x++)
                                            {
                                                System.out.println("Titulo : "+ObtenerCancion.get(x).getTitulo());
                                                System.out.println("Album : "+ObtenerCancion.get(x).getAlbum());
                                                System.out.println("Artista : "+ObtenerCancion.get(x).getArtista());
                                                System.out.println("Geenero : "+ObtenerCancion.get(x).getGenero());
                                                System.out.println("Duracion : "+ObtenerCancion.get(x).getDuracion());
                                                System.out.println("Tamanio : "+ObtenerCancion.get(x).getTamanio());
                                                System.out.println("Codigo : "+ObtenerCancion.get(x).getCodigo()+"\n");     
                                            }
                                        }
                                    // </editor-fold> 
                                    break;
                                case 6: 
                                    // <editor-fold desc="Implementado y funcionando">
                                        System.out.println("----Desplegar lista de reproduccion -----\n");
                                        System.out.print("Nummero de lista que quiere desplegar ");
                                        op=Integer.parseInt(bf.readLine());
                                        Lista_Impl DesplegarLista = int_canciones.DesplegarLista(sesion,op);
                                        if (DesplegarLista==null)
                                            System.out.println("La lista no existe");
                                        else
                                        {
                                            canciones = DesplegarLista.getCanciones();
                                            for(int i=0;i<canciones.size();i++)
                                            {
                                                System.out.println("Codogo: "+canciones.get(i).getCodigo());
                                                System.out.println("Titulo: "+canciones.get(i).getTitulo()+"\t"+"Tiempo: "+canciones.get(i).getDuracion());
                                                System.out.println("Artista: "+canciones.get(i).getArtista()+"\t"+"Genero: "+canciones.get(i).getGenero()+"\n");
                                            }
                                        }
                                    // </editor-fold>  
                                break;
                                case 7:
                                    break;
                                case 8:
                                    break;
                                default:
                                    System.out.println("Digite una opcion valida");
                                    break;    
                            } 
                        }while(op!=8);          
                    }    
                    else
                        System.out.println("El usuario no se encuentra registrado en el sistema");
                    break;
            case 3:
                break;
            default:
                System.out.println("Digite una opcion valida");
                break; 
        } 
        }while(op!=3);
    } 
    
    private static Cancion_Impl hacer_cancion() throws IOException 
    {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        Cancion_Impl can = new Cancion_Impl();
        System.out.println("--------Datos de la cancion--------");
        System.out.print("Titulo   : ");can.setTitulo(bf.readLine());
        System.out.print("Album    : ");can.setAlbum(bf.readLine());
        System.out.print("Artista  : ");can.setArtista(bf.readLine());
        System.out.print("Genero   : ");can.setGenero(bf.readLine());
        System.out.print("Duracion : ");can.setDuracion(bf.readLine());
        System.out.print("Tamanio  : ");can.setTamanio(bf.readLine());
        return can;
    }
}

